﻿// Milking Time POJ - 3616.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3616

/*
贝西是一头勤劳的奶牛。事实上，它非常注重最大限度地提高自己的生产率，以至于它决定安排自己接下来的 N（1 ≤ N ≤ 1,000,000）个小时（方便标记为 0...N-1），以便尽可能多地生产牛奶。

牧场主约翰有 M 个（1 ≤ M ≤ 1,000）可能重叠的挤奶时间段。每个时间段 i 都有一个起始小时（0 ≤ starting_houri ≤ N）、一个结束小时（start_houri < ending_houri ≤ N）
和一个相应的效率（1 ≤ efficiencyi ≤ 1,000,000），表示在该时间段内他能从 Bessie 身上挤出多少加仑牛奶。
约翰牧场主分别在开始小时和结束小时开始和停止挤奶。挤奶时，贝西必须挤满整个间隔时间。

不过，贝西也有她的局限性。在任何挤奶间隔内挤完奶后，它必须休息 R（1 ≤ R ≤ N）小时才能再次挤奶。
给定牧场主约翰斯的间隔时间列表，确定贝西在 N 个小时内的最大产奶量。

输入
* 第 1 行 三个空格分隔的整数： N、M 和 R
* 第 2...M+1 行： 第 i+1 行描述 FJ 的第 i 个挤奶间隔，包含三个空格分隔的整数：开始时间_houri、结束时间_houri 和效率 i

输出
* 第 1 行： Bessie 在 N 小时内最多可挤出的牛奶加仑数

12 4 2
1 2 8
10 12 19
3 6 24
7 10 31

43
*/

const int M = 1010;
long long dp[M];

struct SEG {
	int l, r;
	int e;
}segs[M];
int n, m, r;


void solve1() {
	long long ans = 0;
	for (int i = 1; i <= m; i++) {
		int st = segs[i].l; int end = segs[i].r;
		int val = segs[i].e; dp[i] = val;
		for (int j = 1; j < i; j++) {
			if (st - segs[j].r >= r) {
				dp[i] = max(dp[i], dp[j] + val);
			}
		}

		ans = max(ans, dp[i]);
	}

	printf("%lld\n",ans);
}



bool cmp(const struct SEG& a, const struct SEG& b) {
	if (a.l < b.l) return true;
	else if (a.l == b.l) {
		return a.r < b.r;
	}
	return false;
}

int main()
{
	scanf("%d%d%d", &n, &m, &r);

	for (int i = 1; i <= m; i++) {
		scanf("%d%d%d",&(segs[i].l),&(segs[i].r),&(segs[i].e));
	}
	sort(segs+1, segs+1+m,cmp);
	solve1();


	return 0;
}

 